import socket
import re
import multiprocessing


class WebServer(object):
    def __init__(self):
        self.tcp_server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        self.tcp_server_socket.setsockopt(socket.SOL_SOCKET, socket.SO_REUSEADDR, 1)
        self.tcp_server_socket.bind(('192.168.160.129', 7788))
        self.tcp_server_socket.listen(128)


    def __handle_client(self,new_sock):
        request = new_sock.recv(1024).decode('utf-8')
        #讲请求报文分行存在列表中
        request_lines=request.splitlines()
        file_name = ''
        #request_lines[0]这是请求行，GET /index.html HTTP/1.1
        #这里[^/]表示不包含/的字符，+表示至少一个
        #(/[^ ]*)表示以分组来匹配第一个字符是/，然后不包含空格的0到多个字符
        #[^/]+(/[^ ]*)最后只有一组/index.htm，因此匹配到的值应该至少有/，不为空
        ret = re.match(r'[^/]+(/[^ ]*)',request_lines[0])
        file_name = ret.group(1)
        print('Filename is '+file_name)
        if file_name == '/':
            file_name = '/index.html'

        try:
            f = open('./html'+file_name,'rb')
        except:
            response = 'HTTP/1.1 404 NOT FOUND\r\n'
            response+='\r\n'
            response+='-----file not found------'
            new_sock.send(response.encode('utf-8'))
        else:
            html_content = f.read()
            f.close()
            response = 'HTTP/1.1 200 OK\r\n'
            response+='\r\n'
            new_sock.send(response.encode('utf-8'))
            new_sock.send(html_content)
        new_sock.close()


    def run(self):

        while 1:
            new_sock,client_addr=self.tcp_server_socket.accept()
            p = multiprocessing.Process(target=self.__handle_client,args=(new_sock,))
            p.start()
            #因为新进程再创建过程中会完全复制父进程的运行环境，所以父进程中关闭的只是自己环境中的套接字对象
            #而新进程中因为被复制的环境中是独立存在的，所以不会受到影响，其实就是当创建新进程后会复制主进程的资源（再新建一个引用），这样当关闭主进程里的new_socket时子进程仍存在一个引用
            new_sock.close()
        #关闭监听套接字
        self.tcp_server_socket.close()


def main():
    ws = WebServer()
    ws.run()


if __name__=='__main__':
    main()




